#ifndef cfg_param_H
#define cfg_param_H

#include "tlv_cmd.h"

/*
1、 keil魔术棒中的Target中的FLASH中断向量表偏移
2、 选择DEBUG还是BIN模式【DEBUG模式需要修改设备ID号】
3、 选择电衰还是激光
4、 更新版本号
*/

/*****************************************系统配置********************************************/
// 选择DEBUG还是BIN模式
#define DEBUG_DEBUG_OPEN
// 确定激光/电衰代码
#define MODEL_MOTOR     1
#define MODEL_LASER_DFB 2
#define MODEL_LASER_TA  3
#define MODEL_CHOICE    MODEL_LASER_TA //激光记得修改版本号
// 驱动板设备号 + id号
#define DEVICE_ID_GET(DEVICE, ID) ((uint16_t)(((uint16_t)DEVICE << 8) | (uint16_t)ID))
// 设备选择
#if MODEL_CHOICE == MODEL_MOTOR
#define MODULE_CHOSE_TYPE MODULE_TYPE_MOTOR_MESSAGE_E
#define VERSION           0x00000803
#define DEVICE_CHOSE_ID   DEVICE_ID_GET(DEVICE_TYPE_MOTOR_E, CHIP_ID_1_E)
#else
#define MODULE_CHOSE_TYPE MODULE_TYPE_LASER_MESSAGE_E
#define VERSION           0x00000904
#define DEVICE_CHOSE_ID   DEVICE_ID_GET(DEVICE_TYPE_LASER_E, CHIP_ID_6_E)
#endif
// 软件版本号
#define DEVICE_VERSION VERSION
// FLASH的APP区的地址
#define FLASH_APPLICATION_START_ADDRESS     (uint32_t)0x08020000
#define FLASH_APPLICATION_PARAMETER_ADDRESS (uint32_t)0x0801FC00
#define FLASH_DEVICE_ID_FORMAT              20 // 16字节md5校验码，4字节bin文件大小
#define FLASH_DEVICE_ID_SIZE                7  // 7字节的设备ID号,55AA 0X0X CC 0X0X
// 开启串口1
#define ENABLE_USART1
#ifdef ENABLE_USART1
#define UASRT1_IS_ENABLE
#endif
// 定时器计时超时次数
#define SYSTICK_DELAY_WAIT_LIMIT 1000000
// 只在App区的时候，while循环会让LED1闪烁
#define MOTOR_APP_LED_FRE 10000 //电衰led灯闪烁频率<1Hz
#define MOTOR_APP_LOG_TIMER (MOTOR_APP_LED_FRE * 7 * 30) // *7大约为1s, 30s打印一次
#define LASER_APP_LED_FRE 10 //激光led灯闪烁频率<1Hz
#define LASER_APP_LOG_TIMER (LASER_APP_LED_FRE * 12 * 30) // *12大约为1s, 30s打印一次
#define LASER_PROTECT_LOG_TIMER (150 * 3)  // 监测保护以及读取实际值频率，150大约10s 30s打印一次
#define LASER_PROTECT_WRITE_LOG_TIMER 5    // 监测设置实际值频率，因为不频繁因此5次监测一次即可
// poll轮询指令30s打印一次，2s下发一次poo指令，判断电流源/温度开关
#define POLL_CMD_LOG_TIME 15 
// APP区监测前台程序是否正常运行
#define APP_LED_GPIOPORT LED2_GPIO_Port
#define APP_LED_PIN      LED2_Pin
/******************************************激光器+电衰的ADDA配置**************************************************/
/*ADC1119电流采集芯片配置参数*/
#define ADS1119_CHIP_ADDRESS 0b10001000
#define ADS1119_VREF_CHAN_1  3
#define ADS1119_VREF_CHAN_2  3
#define ADS1119_MAXCODE      32768
// ADC1119I2C通信最大时间，打断点测试在1ms以内
#define ADS1119_I2C_DELAY_TIME_LIMIT 100
// DRDY引脚循环判断上限
#define ADS1119_DRDY_WAIT_LIMIT 32000
/*DAC5541电流输出芯片配置参数*/
#define AD5541_VREF_SEED 3
#define AD5541_VREF_TA   2.5
#define AD5541_MAXCODE   65536
// DAC5541I2C通信最大时间
#define DAC5541_SPI_DELAY_TIME_LIMIT 100
/*DAC8830温度输出芯片配置参数*/
#define DAC8830_VREF    1.5
#define DAC8830_MAXCODE 65536
// DAC88301I2C通信最大时间
#define DAC8830_SPI_DELAY_TIME_LIMIT 100
/*ADC7689温度采集芯片配置参数*/
#define AD7689_VREF    2.5
#define AD7689_MAXCODE 65536
// ADC7689寄存器配置参数
#define AD7689_CFG  1 //覆盖寄存器内容
#define AD7689_INCC 7 //单级性，以GND为参考
#define AD7689_BW   1 //全带宽低通滤波器
#if MODEL_CHOICE == MODEL_MOTOR
#define AD7689_REF_CHOSE 0 //电衰为原本的内部基准电压源，REF = 2.5V
#else
#define AD7689_REF_CHOSE 7 //激光修改为外部基准电压源
#endif
#define AD7689_REF AD7689_REF_CHOSE
#define AD7689_SEQ 0 //禁用序列器
#define AD7689_RB  1 //不回读CFG寄存器配置内容
// ADC7689寄存器配置输出, chn从0开始
#define AD7689_WCfg(chn) (AD7689_CFG << 13) | (AD7689_INCC << 10) | ((chn) << 7) | (AD7689_BW << 6) | (AD7689_REF << 3) | (AD7689_SEQ << 1) | AD7689_RB;
// ADC7689平均滤波的个数
#define AD7689_LASER_MEAN_COUNT 10
// ADC7689寄存器配置采集的通道对应的含义
#define ADC7689_LASER_SAMP_TEMP_CHAN_1       0x05
#define ADC7689_LASER_SAMP_TEMP_CHAN_2       0x02
#define ADC7689_LASER_SAMP_TEMPCTRCUR_CHAN_1 0x04
#define ADC7689_LASER_SAMP_TEMPCTRCUR_CHAN_2 0x03

//温度、温控和PD光功率
#define ADC7689_LASER_TEMP_CHAN_1            0x07
#define ADC7689_LASER_TEMPCTR_CHAN_1				 0x05
#define ADC7689_LASER_TEMP_CHAN_2						 0x04
#define ADC7689_LASER_TEMPCTR_CHAN_2				 0x01
#define ADC7689_LASER_PDPOWER_CHAN_2      	 0x00   //PD电流采集


// AD7689读取无效次数
#define AD7689_INVALID_COUNT 3
// AD7689读取间隔1us
#define AD7689_SAMP_DELAY 1
// 为节约计算时间，直接算出该值：AD7689_MAXCODE * AD7689_VREF / INA180_R / INA180_GAIN * 1000 / AD7689_MOTOR_MEAN_COUNT
#define AD7689_MOTOR_PARA 65.536f
// AD7689芯片SPI通讯最长等待时间，打断点测试4us，设置为100ms
#define AD7689_SPI_DELAY_TIME_LIMIT 100
// 种子和TA进行ADDA转换的电阻
#define ADDA_R_SEED 10
#define ADDA_R_TA   0.05
// 种子和TA进行ADDA转换的增益系数
#define ADDA_GAIN_SEED 1
#define ADDA_GAIN_TA   10
// 测路响应系数
#define ADDA_PD_RESPONSE_COEFFICIENT 550 // mA/W
// PD转换电阻
#define ADDA_R_PD 300

/***************************************激光器电流/温度配置********************************************/
// 初始化 温控芯片打开后等待的时间
#define TEMP_INIT_WAIT_TIME_S 5
// 激光器ID
#define LASER_NUMBER_CHAN_1 1
#define LASER_NUMBER_CHAN_2 2
// 电流/温度每次改变值需要的等待20ms
#define MS1_NUM 20
//TA工作模式
#define TA_POWER_MODE 0
#define TA_CURRENT_MODE 1
#define TA_WORKING_MODE TA_POWER_MODE
// DFB激光器电流的上下限阈值（mA）
#define CURRENT_LOW_LIMIT_DFB_LASER_SEED  0
#define CURRENT_HIGH_LIMIT_DFB_LASER_SEED 142
// TA激光器种子通道电流的上下限阈值（mA）
#define CURRENT_LOW_LIMIT_TA_LASER_SEED  0
#define CURRENT_HIGH_LIMIT_TA_LASER_SEED 142
// TA激光器TA通道工作电流的上下限阈值（mA）
#define CURRENT_LOW_LIMIT_TA_LASER_TA  0
#define CURRENT_HIGH_LIMIT_TA_LASER_TA 3000
// TA的PD电流的上下限阈值（mA）
#define CURRENT_LOW_LIMIT_TA_LASER_PD  0
#define CURRENT_HIGH_LIMIT_TA_LASER_PD 3.3
// 电流缓慢变化分隔值
#define CURRENT_SEPARAT_SEED 60
#define CURRENT_SEPARAT_TA 1000//分隔值1000，1000之前之后的步进不同
#define CURRENT_PD_STEP_PD   0.01
#define CURRENT_TA_STEP_TA 100//按照1mA步进
// 电流缓慢变化的步进
#define CURRENT_STEP_BASE          1
#define CURRENT_STEP_UNDER_60_SEED 1
#define CURRENT_STEP_ABOVE_60_SEED 2
#define CURRENT_STEP_BASE_TA       1
#define CURRENT_STEP_UNDER_1000_TA 10
#define CURRENT_STEP_ABOVE_1000_TA 20

// 温度缓慢变化的步进（温度直接改变）
#define TEMP_STEP_BASE 1
// 温度的上下限阈值/阈值超出范围
#define TEMP_LOW_LIMIT  5
#define TEMP_HIGH_LIMIT 42
// 两个通道的错误码
#define LASER_MAX_ERROR_CHANNEL 2
// PD电流需要再加上一个固定值mA
#define LASER_PD_CURRENT_ADD 0.0475

/******************************************电衰配置**************************************************/
//使用1:100减速比电机
#define MOTOR1_100
// 堵转电流
#ifdef MOTOR1_100
#define MOTOR_CURRENT_LIMIT 350
#else
#define MOTOR_CURRENT_LIMIT 900
#endif
// 四组电机的错误码
#define MOTOR_MAX_ERROR_CHANNEL 4
// 每组电机个数
#define MOTOR_MAX_NUM 8
// EEPROM存放电机位置和步序的首地址
#define MOTOR_EEPROM_POSITION_ADDR 0x00
#define MOTOR_EEPROM_STEP_ADDR     0x80
// 电机最大转动步数
#define MOTOR_RUN_MAX_STEP 8000
// S型曲线定时器重载值数组大小
#define CURVE_S_PERIOD_SIZE (MOTOR_RUN_MAX_STEP / 2)
// 定时器初始重载值
#define CURVE_S_PERIOD_INIT (1000 - 1)
//电机不检测电流步数,以避免电机启动时堵转报错
#define MOTOR_NO_CURRENT_TEST_STEP 5
// 采集电流电路的电阻
#define INA180_R 0.05
// 采集电流电路的增益系数
#define INA180_GAIN 50
// 电机AD7689采集电流的平均滤波次数
#define AD7689_MOTOR_MEAN_COUNT 1
// 电衰转动过程中led的闪烁周期（次）
#define TIMER_LED_COUNT 50
// 除4就是定时器频率，也就是电机输出脉冲最高频率
#define FRE_MAX 750
// 除4就是定时器频率，也就是电机输出脉冲最低频率
#define FRE_MIN 550
// S型曲线趋势系数，越大就越陡峭
#define FRE_FLEXIBLE 4
// 定时器分频系数
#define PRESCALER (100 - 1)
// 定时器驱动器频率：分频之后的频率 100M / (10000 - 1 + 1) = 10000
#define TIMER_DIV_FRE (100 * 1000000 * 1.0 / (PRESCALER + 1))

/***************************************EEPROM配置********************************************/
// EEPROM超时上限
#define I2C3_TIMEOUT_MULTIPLIER 0XFF
// EEPROM的读写地址
#define EEPROM_ADDRESS_WRITE 0xA0
#define EEPROM_ADDRESS_READ  0xA1
// ATC02/ATC128每页最大写入字节
#define ATC02_PAGE_SIZE  8
#define ATC128_PAGE_SIZE 64
// EEPROM读取不同参数的相应位置/每个数据四个字节
#define EEPROM_TEMP_CURRENT_SEED_ADDR 0x00
#define EEPROM_TEMP_CURRENT_TA_ADDR   0x08

#endif
